#ifndef _LINUX_PCIE_IRQ_H
#define _LINUX_PCIE_IRQ_H

#include <linux/types.h>
#include <linux/device.h>
#include <linux/pci.h>
#include <linux/interrupt.h>
#include <linux/msi.h>
#include <linux/workqueue.h>
#include <linux/atomic.h>

/*
 * 系统支持的最大中断资源数量：
 *  1. MSI-X: PCI 3.0+ 规范支持的最大向量数 (2048)
 *  2. MSI:   PCI 规范支持的最大向量数 (32)
 *  3. Legacy: 传统PCI设备支持的最大中断数 (1)
 * 注意：实际可用数量受设备能力和系统资源限制
 */
#define PCIE_IRQ_MAX_VEC_MSIX       2048
#define PCIE_IRQ_MAX_VEC_MSI        32
#define PCIE_IRQ_MAX_VEC_LGCY       1

struct pcie_irq_t {
    struct pci_dev *pdev;                                   /* 关联的 PCI 设备 */
    int mode;                                               /* 中断模式 (MSI-X, MSI, Legacy) */
    unsigned long flags;                                    /* 中断标志 */
    int vec_num;                                            /* 中断向量数量 */
    int vector[PCIE_IRQ_MAX_VEC_MSIX];                      /* 中断向量数组 */
    char name[PCIE_IRQ_MAX_VEC_MSIX][32];                   /* 中断名称数组 */
    int num;                                                /* 已注册的中断数量 */
    // struct msix_entry msix_entries[IRQ_MAX_VEC_MSIX];    /* MSI-X 表项 */
};

struct pcie_irq_ctrl_t {
    char name[32];                      /* 设备名称 */
    struct pcie_irq_t *irq;             /* 中断信息指针 */
    int vec_start;                      /* 向量起始索引 */
    int vec_end;                        /* 向量结束索引 */
    irq_handler_t handler;              /* 中断处理函数 */
};

extern struct pcie_irq_t pcie_irq;

int init_pcie_irq(struct pci_dev *pdev, struct pcie_irq_ctrl_t *ctrl, 
                  int mode, int vec_start, int vec_end, 
                  irq_handler_t handler, const char *name, 
                  void *dev, int dev_offset, void __iomem *reg_base);
void exit_pcie_irq(struct pcie_irq_ctrl_t *irq, void *dev, int dev_offset);

#endif /* _LINUX_PCIE_IRQ_H */
